sudo 命令的一些小技巧

sudo

在Linux下,我们需要使用sudo命令,让普通用户也能执行一些root命令,本文对常用的一些sudo操作以及平时没有发现的小技巧进行简单介绍。

1. 授权

普通用户如果没有权限访问某些文件或者执行某个命令时,要是该用户获得root授权,就可以通过在要执行的命令前加上sudo,临时切换到root用户的权限完成相关操作。

怎样让用户可以临时获取root权限呢?这就需要在/etc/sudoers文件中进行配置:

1
2
#授权给单个用户所有命令的执行权限
username ALL=(ALL) ALL

上面这个例子中:

  • username: 允许使用suod的用户名
  • ALL: 允许从任何终端(机器)使用sudo
  • (ALL): 允许以任何用户身份执行sudo
  • ALL: 允许sudo权限执行任何命令

如果我们想让用户chyrain只能在本机(主机名为work-pc)以root账户执行/bin/chown/bin/chmod这两条命令,那么就应该这样配置:

1
chyrain work-pc=(root) /bin/chown,/bin/chmod

当你的帐号在/etc/sudoers文件中被授予 sudo 的权限,那么你就可以将任何 root 命令作为 sudo 命令的参数,使用 root 权限来执行该命令。首次使用会要求你输入当前用户的密码,系统确实输入正确即以 root 权限来执行 mount 命令,接下来一段时间(默认为5分钟)再次使用 sudo 命令就不需要输密码了。

2. 执行root命令后忘记加sudo

我们会碰到这样一种情形,当我们输入一个长长的命令,果断地敲下回车之后出现无权限操作,才发现忘记在命令前面加sudo了,一般我们的做法是按 ↑ 回到上一条命令,在该命令之前加上sudo,再执行该命令。

其实,我们并不需要这样,只要输入sudo !!即可,这里的!!代表上一条命令。如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ cat /etc/sudoers
cat: cannot open /etc/sudoers for reading: Permission denied
$ sudo !!
sudo cat /etc/sudoers
## sudoers file.
##
## This file MUST be edited with the 'visudo' command as root.
## Failure to use 'visudo' may result in syntax or file permission errors
## that prevent sudo from running.
##
## See the sudoers man page for the details on how to write a sudoers file.
##
## User privilege specification
##
root ALL=(ALL) ALL
%admin ALL=(ALL) ALL
#

3. vim编辑完成后发现忘记使用sudo无法保存

我们经常会遇到这样的一个囧境:使用 vim 对某个文件进行编辑,编辑完之后,按 ESC 之后回到普通模式,再按 :wq 准备保存退出时,发现没有权限对该文件进行修改,我们在使用 vim 命令时忘记在前面加 sudo 了。我就经常出现这种问题,之前的做法是只能不保存强退,再加上 sudo 重新编辑。

但是今后我们再也不需要用这么愚蠢的做法了,我们可以在 vim 的普通模式下,按 :w !sudo tee % ,这样就可以 root 权限来保存文件了,你也无需因为自己一时忘记加个 sudo 而沮丧懊恼了!

4. shell 内置命令如何使用 sudo

shell 是一个交互式的应用程序,在执行外部命令时通过 fork 来创建一个子进程,再通过 exec 来加载外部命令的程序来执行,但是如果一个命令是 shell 内置命令,那么只能直接由 shell 来运行。sudo 的意思是,以别的用户(如root)的权限来 fork 一个进程,加载程序并运行,因此 sudo 后面不能跟 shell 的内置命令,如:

1
2
$ sudo cd /sys/kernel/debugfs
sudo: cd: command not found

在这种情况,我们又没有 root 账户的密码,我们怎样执行该命令呢?有种办法就是使用 sudo 获得root shell 的权限,然后 在root shell 中执行该命令 。进入root shell 很简单,输入sudo bash 确认本用户的密码即可,此时你会发现命令提示符显示当前是 root。一旦获得root shell,你可以执行任何命令而不需要在每条命令前输入sudo了。

另外,常用的shell 内置命令在这里 有简单介绍,我们可以使用 type 命令来查看命令的类型,如:

1
2
3
4
$ type ls
ls is /bin/ls
$ type umask
umask is a shell builtin

5. sudo操作记录日志

作为一个 Linux 系统的管理员,不仅可以让指定的用户或用户组作为root用户或其它用户来运行某些命令,还能将指定的用户所输入的命令和参数作详细的记录。而sudo的日志功能就可以用户跟踪用户输入的命令,这不仅能增进系统的安全性,还能用来进行故障检修。但是要记录sudo的日志还要一些简单的配置:

  • 创建sudo日志文件
    我们将sudo日志文件放置在/var/log/sudo.log文件中:

    1
    $ sudo touch /var/log/sudo.log
  • 修改/etc/rsyslog.conf配置文件
    我的系统为Ubuntu为该名字,但有些系统名为/etc/syslog.conf,注意不同发行版本之间的差别,在该文件加入下面一行:

    1
    local2.debug /var/log/sudo.log #空白不能用空格,必须用tab
  • 修改/etc/sudoers配置文件
    注意网上很多关于sudo日志文件配置的都缺少这一步,在该文件中加入下面一行:

    1
    Defaults logfile=/var/log/sudo.log
  • 重启syslog服务

    1
    $ sudo service rsysylog restart
  • 查看suod日志记录
    经过上面配置,sudo的命令记录都会记录到文件/var/log/sudo.log中,例如我们执行几条sudo命令之后,查看该文件的记录如下:

    1
    2
    3
    4
    5
    $ cat sudo.log
    Nov 17 22:23:52 : chyrain : TTY=pts/1 ; PWD=/var/log ; USER=root ; COMMAND=/bin/cat /etc/sudoers
    Nov 17 22:24:42 : chyrain : TTY=pts/1 ; PWD=/var/log ; USER=root ; COMMAND=/bin/ls
    Nov 17 22:28:12 : chyrain : TTY=pts/1 ; PWD=/var/log ; USER=root ; COMMAND=/usr/sbin/service rsyslog restart
    Nov 17 22:29:26 : chyrain : TTY=pts/1 ; PWD=/var/log ; USER=root ; COMMAND=/bin/ls /root/